const {
  NAME_OR_PASSWORD_IS_REQUIRED,
  NAME_IS_NOT_EXISTS,
  PASSWORD_IS_INCORRENT,
  UNAUTHORIZATION,
} = require("../config/error.constants")
const userService = require("../service/user.service")
const md5Encryption = require("../utils/md5.encryption")
const jwt = require("jsonwebtoken")
const { PUBLIC_KEY } = require("../app/screct")

const loginVerify = async (ctx, next) => {
  const { name, password } = ctx.request.body
  // 1. 判断用户名是否为空
  if (!name || !password) {
    return ctx.app.emit("error", NAME_OR_PASSWORD_IS_REQUIRED, ctx)
  }

  // 2. 查询该用户是否在数据库中存在，不存在则直接 return
  const users = await userService.findUserByName(name)
  const user = users[0]
  // console.log(user)
  if (!user) {
    return ctx.app.emit("error", NAME_IS_NOT_EXISTS, ctx)
  }

  // 3. 查询数据库中的密码和传入的密码是否一致
  if (user.password !== md5Encryption(password)) {
    return ctx.app.emit("error", PASSWORD_IS_INCORRENT, ctx)
  }

  // 4. 将数据库中的 user对象 保存在 ctx 中
  ctx.user = user

  await next()
}

const authorVerify = async (ctx, next) => {
  // 验证身份
  // 1. 获取token
  const authorization = ctx.headers.authorization
  // 注意 Bearer 后面有一个空格
  if (!authorization) {
    return ctx.app.emit("error", UNAUTHORIZATION, ctx)
  }
  const token = authorization.replace("Bearer ", "")
  // 2. 验证token
  try {
    const res = jwt.verify(token, PUBLIC_KEY, {
      algorithms: ["RS256"],
    })
    // console.log(res) // 结果：{ id: 3, name: 'lsr2', iat: 1693410388, exp: 1693496788 }

    // 3.将 res 保留到 ctx.user 中
    ctx.user = res

    // 4. 执行下一个中间件
    await next()
  } catch (error) {
    console.log(error)
    ctx.app.emit("error", UNAUTHORIZATION, ctx)
  }
}

module.exports = { loginVerify, authorVerify }
